package com.exercise.algorithm;

import com.fun.frame.SourceCode;
import com.fun.utils.Time;

import java.util.ArrayList;
import java.util.List;

/*
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数，并且每种组合中不存在重复的数字。

说明：

所有数字都是正整数。

解集不能包含重复的组合。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
 */
public class A216 extends SourceCode {

    static List<List<Integer>> re = new ArrayList<>();

    public static void main(String[] args) {
        long a = Time.getTimeStamp();
        sum(7, 3);
        long b = Time.getTimeStamp();
        output(b - a);
        output(re);
    }

    public static void sum(int n, int k) {
        sum(n, k, 0, 1, new ArrayList<>());
    }

    public static void sum(int n, int k, int sum, int begin, List<Integer> list) {
        if (sum > n || k == 0) {
            if (n == sum) {
                re.add(new ArrayList<>(list));
            }
            return;
        }
        for (int i = begin; i < 10; i++) {
            list.add(i);
            sum(n, k - 1, sum + i, i + 1, list);
            list.remove(list.size() - 1);//递归结束后，把最后一个删除，为了进行下for循环的下一项
        }
    }
}
